package org.jsola.hr.provider;

import org.jsola.notice.dto.NoticeRuleSettingAddDTO;
import org.jsola.notice.dto.NoticeRuleSettingUpdateDTO;
import org.jsola.notice.dto.UserNoticeAddDTO;
import org.jsola.notice.entity.NoticeGroupDO;
import org.jsola.notice.entity.NoticeRuleSettingDO;
import org.jsola.notice.vo.NoticeGroupListVO;
import org.jsola.notice.vo.NoticeRuleSettingVO;
import org.jsola.notice.vo.NoticeTypeVO;
import org.jsola.user.core.TokenUser;

import java.util.List;

/**
 * 消息通知
 *
 * @author wcl
 */
public interface INoticeProviderService {


    /**
     * 备忘录提醒消息通知发送
     *
     * @param companyId   公司id
     * @param content     消息内容
     * @param companyName 公司名称
     * @param tokenUser   当前用户
     */
    void memoRemindNoticeSend(String companyId, String content, String companyName, TokenUser tokenUser);

    /**
     * 合同员工签署成功消息通知发送
     *
     * @param companyId   公司id
     * @param userId      接收消息的用户Id
     * @param content     消息内容
     * @param companyName 公司名称
     * @param tokenUser   当前用户
     */
    void empSignOverNoticeSend(String companyId, String userId, String content, String companyName, TokenUser tokenUser);

    /**
     * 查询站点下通知分类
     *
     * @param companyId  公司id
     * @param moduleType 模块类型
     * @param tokenUser  当前用户
     * @return 通知分类列表信息
     */
    List<NoticeGroupListVO> listAllByCompanyId(String companyId, String moduleType, TokenUser tokenUser);

    /**
     * 查询所有通知分类,不区分租户
     *
     * @param moduleType 模块类型
     * @return 通知分类
     */
    List<NoticeGroupListVO> listAll(String moduleType);

    /**
     * 根据组id查询类型
     *
     * @param moduleType 模块类型
     * @param groupId    组id
     * @return 通知类型
     */
    List<NoticeTypeVO> listTypeByGroupId(String moduleType, Long groupId);

    /**
     * 新增消息提醒规则设置
     *
     * @param noticeRuleSettingAddDTO 新增消息提醒规则设置DTO
     * @param tokenUser               当前用户
     * @return 消息提醒规则设置详情信息
     */
    NoticeRuleSettingVO save(NoticeRuleSettingAddDTO noticeRuleSettingAddDTO, TokenUser tokenUser);

    /**
     * 修改消息提醒规则设置
     *
     * @param noticeRuleSettingUpdateDTO 修改消息提醒规则设置DTO
     * @param tokenUser                  当前用户
     * @return 更新数量
     */
    int update(NoticeRuleSettingUpdateDTO noticeRuleSettingUpdateDTO, TokenUser tokenUser);

    /**
     * 开启消息提醒规则设置
     *
     * @param id        消息提醒规则设置id
     * @param tokenUser 当前用户
     * @return 开启数量
     */
    int openNoticeRuleSetting(Long id, TokenUser tokenUser);

    /**
     * 关闭消息提醒规则设置
     *
     * @param id        消息提醒规则设置id
     * @param tokenUser 当前用户
     * @return 关闭数量
     */
    int closeNoticeRuleSetting(Long id, TokenUser tokenUser);

    /**
     * 初始化用工单位通知规则设置,不区分租户
     *
     * @param userIdList 用户id集合
     * @param moduleType 模块类型
     * @param companyId  用工单位id
     * @param tokenUser  当前用户
     */
    void initNoticeRuleSettingByCompanyId(List<String> userIdList, String moduleType, String companyId, TokenUser tokenUser);

    /**
     * 根据模块类型,通知类型和公司查询通知规则设置
     *
     * @param moduleType   模块类型
     * @param noticeTypeId 通知类型id
     * @param companyId    用工单位id
     * @return 通知规则设置
     */
    NoticeRuleSettingVO selectByTypeCodeAndCompany(String moduleType, Long noticeTypeId, String companyId);

    /**
     * 根据模块类型,通知类型code和公司查询通知规则设置
     *
     * @param moduleType     模块类型
     * @param noticeTypeCode 通知类型code
     * @param companyId      用工单位id
     * @return 通知规则设置
     */
    NoticeRuleSettingVO selectByTypeCodeAndCompany(String moduleType, String noticeTypeCode, String companyId);

    /**
     * 根据模块类型,通知类型code和公司查询通知规则设置是否开启
     * 如果通知规则不存在,返回false
     *
     * @param moduleType     模块类型
     * @param noticeTypeCode 通知类型code
     * @param companyId      用工单位id
     * @return true:开启 false:关闭
     */
    boolean isOpen(String moduleType, String noticeTypeCode, String companyId);

    /**
     * 根据通知类型code查询通知规则设置
     *
     * @param noticeTypeCode 通知类型code
     * @return 通知规则设置
     */
    List<NoticeRuleSettingDO> listByNoticeTypeCode(String noticeTypeCode);

    /**
     * 根据公司id和通知类型code查询通知规则设置
     *
     * @param companyId      公司id
     * @param noticeTypeCode 通知类型code
     * @return 通知规则设置
     */
    List<NoticeRuleSettingDO> listByCompanyIdAndNoticeTypeCode(String companyId, String noticeTypeCode);

    /**
     * 根据通知code新增用户通知
     *
     * @param userNoticeAddDTO 通知
     * @param noticeTypeCode   消息code
     * @param tokenUser        当前用户
     */
    void saveByCode(UserNoticeAddDTO userNoticeAddDTO, String noticeTypeCode, TokenUser tokenUser);

    /**
     * 批量根据通知id新增用户通知
     *
     * @param userNoticeAddList 通知
     * @param noticeTypeId      消息id
     * @param tokenUser         当前用户
     */
    void batchSaveByCode(List<UserNoticeAddDTO> userNoticeAddList, Long noticeTypeId, TokenUser tokenUser);

    /**
     * 根据通知分组名称查询通知分组
     *
     * @param name 通知分组名称
     * @return 通知分组
     */
    NoticeGroupDO selectGroupByName(String name);

    /**
     * 根据类型或分组查询消息数量
     *
     * @param groupId   分组Id
     * @param typeId    类型Id
     * @param read      是否已读
     * @param tokenUser 当前用户
     * @return 消息数量
     */
    int selectUserCountByTypeOrGroup(Long groupId, Long typeId, Boolean read, TokenUser tokenUser);

    /**
     * 查询给定应用工单位推送的通知
     *
     * @param moduleType     moduleType
     * @param noticeTypeCode code
     * @param companyIdList  用工单位Id
     * @return 通知
     */
    List<NoticeRuleSettingDO> selectByCompanyIdList(String moduleType, String noticeTypeCode,
                                                    List<String> companyIdList);

    /**
     * 查询给定应用户推送的通知
     *
     * @param moduleType     moduleType
     * @param noticeTypeCode code
     * @param userId         userId
     * @return 通知
     */
    List<NoticeRuleSettingDO> selectByUserId(String moduleType, String noticeTypeCode, String userId);
}
